// 导入数据库操作模块
const db = require("../db/index");
// 导入密码加密模块
const bcrypt = require("bcryptjs");
/* 
   获取用户基本信息
1、根据用户的id,查询数据库中的基本信息
2、执行sql语句
3、成功-响应用户信息
*/
exports.getUserinfo = (req, res) => {
  // req对象的user属性，是express-jwt解析token成功后挂载上去的，里面包括了token中携带的用户信息
  // 1、根据用户的id,查询数据库中的基本信息
  // 为了防止用户的密码泄露，需要排除 password 字段
  const sql = `select id, username, nickname, email, user_pic from ev_users where id=?`;
  // 2、执行sql语句
  db.query(sql, req.user.id, function (err, result) {
    if (err) return res.cc(err);
    if (result.length !== 1) return res.cc("获取用户信息失败");
    // 3、成功-响应用户信息
    res.send({
      status: 0,
      message: "获取用户信息成功！",
      data: result[0],
    });
  });
};
// 更新用户基本信息
exports.updataUserInfo = (req, res) => {
  // 定义更新sql语句
  const sql = `update ev_users set ? where id=?`;
  // 执行sql语句
  db.query(sql, [req.body, req.body.id], (err, result) => {
    // 执行sql语句失败
    if (err) return res.cc(err);
    // 执行sql语句成功，但影响条数不为1
    if (result.affectedRows !== 1) return res.cc("修改用户基本信息失败！");
    // 修改用户信息成功
    return res.cc("修改用户基本信息成功！", 0);
  });
};
// 重置密码
/* 
1、验证旧密码和新密码格式是否合法 (后端不相信前端传过来的数据，配置路由中间件)
2、根据id，查询用户是否存在 
3、判断旧密码是否输入正确 (需要bcrypt比较)
4、根据用户id，更新密码 （需要bcrypt加密）
*/
exports.updataPassword = (req, res) => {
  // 根据id,查询用户是否存在
  const selSql = `select * from ev_users where id=?`;
  db.query(selSql, req.user.id, function (err, result) {
    if (err) return res.cc(err);
    if (result.length !== 1) return res.cc("用户不存在！");
    // 判断旧密码输入是否正确
    const compareRes = bcrypt.compareSync(req.body.oldPwd, result[0].password);
    if (!compareRes) return res.cc("原密码输入错误！");
  });
  // 定义更新密码的sql语句
  const updatePwdSql = `update ev_users set password=? where id=?`;
  // 对新密码加密 bcrypt.hashSync(明文密码，随机取的长度)
  const newPwd = bcrypt.hashSync(req.body.newPwd, 10);
  // 执行sql语句
  db.query(updatePwdSql, [newPwd, req.user.id], function (err, result) {
    if (err) return res.cc(err);
    if (result.affectedRows !== 1) return res.cc("更新密码失败");
    // 更新密码成功
    return res.cc("更新密码成功！", 0);
  });
};

// 更新用户头像
/* 
1、验证表单数据
2、更新头像
*/
exports.updateAvatar = (req, res) => {
  // 定义更新头像的sql语句
  const sql = `update ev_users set user_pic=? where id=?`;
  db.query(sql, [req.body.avatar, req.user.id], (err, result) => {
    if (err) return res.cc(err);
    if (result.affectedRows !== 1) return res.cc("更新头像失败");
    // 更新成功
    res.cc("更新头像成功！", 0);
  });
};
